package cn.bugstack.mybatis.transaction;

import java.sql.Connection;

/**
 *
 */
public enum TransactionIsolationLevel {

    //包括JDBC支持的5个级别

    /**
     * 解释：已提交读。一个事务只能看到其他事务已经提交的数据变更。换句话说，在事务开始后，即使有其他事务对数据进行了修改并提交，本事务也只能读取到那些已经被提交的改变。
     * 示例：假设银行账户A和B在同一时间进行转账操作。在READ_COMMITTED模式下，如果A先提交了转账给B的操作，那么随后B查询余额时将能看到A转过来的钱。
     */
    NONE(Connection.TRANSACTION_NONE),

    /**
     * 解释：未提交读（也称“脏读”）。一个事务可以看到其他事务尚未提交的修改。这种隔离级别可能导致数据不一致性和不可重复读问题。
     * 示例：同样考虑上述银行转账的例子，在READ_UNCOMMITTED模式下，即使A还未提交转账给B的操作，B也能看到增加的金额，如果A最终决定不提交该交易，那么B看到的将是临时且不准确的数据。
     */
    READ_UNCOMMITTED(Connection.TRANSACTION_READ_UNCOMMITTED),

    /**
     * 解释：已提交读。一个事务只能看到其他事务已经提交的数据变更。换句话说，在事务开始后，即使有其他事务对数据进行了修改并提交，本事务也只能读取到那些已经被提交的改变。
     * 示例：假设银行账户A和B在同一时间进行转账操作。在READ_COMMITTED模式下，如果A先提交了转账给B的操作，那么随后B查询余额时将能看到A转过来的钱。
     */
    READ_COMMITTED(Connection.TRANSACTION_READ_COMMITTED),

    /**
     * 解释：可重复读。一个事务在自身持续期间内多次读取同一份数据，结果总是相同的，不受其他事务对该数据修改的影响。但不能防止幻读现象（即当其他事务插入新的记录时，当前事务再次全表扫描会看到新增记录）。
     * 示例：在REPEATABLE_READ模式下，如果用户A在一次事务内两次查询自己的账户余额，即使在这两次查询之间有其他事务对A的账户进行了存款操作并已提交，A仍然只会看到第一次查询时的余额。
     */
    REPEATABLE_READ(Connection.TRANSACTION_REPEATABLE_READ),

    /**
     * 解释：序列化。这是最高的事务隔离级别，提供严格的事务隔离。在此级别下，事务按顺序执行，如同串行执行一样，完全避免了脏读、不可重复读和幻读问题。但可能会导致并发性能下降。
     * 示例：在SERIALIZABLE模式下，如果两个事务尝试同时修改同一条记录，其中一个事务必须等待另一个事务结束才能继续执行，从而保证了事务之间的串行化执行，确保数据一致性。
     */
    SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE);

    private final int level;

    TransactionIsolationLevel(int level) {
        this.level = level;
    }

    public int getLevel() {
        return level;
    }

}
